from datetime import datetime

from data import client_parkings as data
from errors import ParkingUnavailable

from service import parkings


def park_client(client_id: int, parking_id: int) -> dict:
    """Создаёт запись о парковке указанного клиента на указанной парковке,
    если она доступна (открыта и там есть места). Уменьшает количество свободных мест на парковке.

    :returns созданную запись о парковке клиента
    """
    if not parkings.is_parking_available(parking_id):
        raise ParkingUnavailable(f"Parking with id={parking_id} is not available")

    client_parking = data.create_client_parking_json(client_id, parking_id)
    parkings.decrease_places_count(parking_id)

    return client_parking


def process_payment(
    client_id: int, parking_id: int, time_in: datetime, time_out: datetime
) -> None:
    minutes = int((time_out - time_in).total_seconds() / 60)
    print(f"Processing payment for {minutes} minutes...")


def end_parking(client_id: int, parking_id: int) -> None:
    """Обновляет запись о парковке указанного клиента на указанной парковке,
    завершая её - указывает время окончания парковки; увеличивает количество свободных мест на парковке.
    """
    # Устанавливаем время завершения парковки
    client_parking = data.update_client_parking_json(
        client_id, parking_id, time_out=datetime.now()
    )

    # Производим "оплату"...
    process_payment(
        client_id,
        parking_id,
        time_in=client_parking["time_in"],
        time_out=client_parking["time_out"],
    )

    # Удаление записи о парковке
    data.delete_client_parking(client_id, parking_id)

    # Увеличиваем количество мест на парковке
    parkings.increase_places_count(parking_id)
